#include <head.h>

int main(int argc, char const *argv[])
{
    DIR *dir = opendir("./");
    DIR_OPEN_ERR(dir);
    struct dirent *dp = readdir(dir);
    while (dp)
    {
        if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, ".."))
        {

            struct stat st;
            stat(dp->d_name, &st);

            // 文件类型   ls
            switch (st.st_mode & S_IFMT)
            {
            case S_IFREG:
                printf("-");
                break;
            case S_IFDIR:
                printf("d");
                break;
            case S_IFCHR:
                printf("c");
                break;
            case S_IFBLK:
                printf("b");
                break;
            default:
                break;
            }

            // 文件权限
            printf((st.st_mode & S_IRUSR) ? "r" : "-"); //  用户权限
            printf((st.st_mode & S_IWUSR) ? "w" : "-"); //  用户权限
            printf((st.st_mode & S_IXUSR) ? "x" : "-"); //  用户权限
            printf((st.st_mode & S_IRGRP) ? "r" : "-"); //  用于组
            printf((st.st_mode & S_IWGRP) ? "w" : "-"); //  用于组
            printf((st.st_mode & S_IXGRP) ? "x" : "-"); //  用于组
            printf((st.st_mode & S_IROTH) ? "r" : "-"); //  其他用户
            printf((st.st_mode & S_IWOTH) ? "w" : "-"); //  其他用户
            printf((st.st_mode & S_IXOTH) ? "x" : "-"); //  其他用户

            printf(" %ld", st.st_nlink);
            struct passwd *u_name = getpwuid(st.st_uid);
            printf(" %s", u_name->pw_name);
            struct passwd *g_name = getpwuid(st.st_gid);
            printf(" %s ", g_name->pw_name);
            printf(" %5ld ", st.st_size);
            struct tm *tm1 = localtime(&st.st_mtime);
            printf(" %d月  %d %d:%d", tm1->tm_mon + 1, tm1->tm_mday, tm1->tm_hour, tm1->tm_min);
            printf(" %s\n", dp->d_name);
        }
        dp = readdir(dir); // 获取下一个文件 最后返回null
    }
    closedir(dir);
    return 0;
}
